<?php
declare (strict_types = 1);

namespace app\command;

use think\console\Command;
use think\console\Input;
use think\console\input\Argument;
use think\console\input\Option;
use think\console\Output;

/**
 * 因为有说法不要在fpm下运行多进程，应采用cli。
 * Class Async
 * @package app\command
 */
class Async extends Command
{
    protected function configure()
    {
        // 指令配置
        $this->setName('async')
            ->setDescription('the async command');

    }

    protected function execute(Input $input, Output $output)
    {
        // 指令输出
        $output->writeln('async');

        //执行具体逻辑
        //僵尸进程，子进程结束后，父进程没有回收处理
        $pid = pcntl_fork();
        if ($pid > 0) {
            // 下面这个函数可以更改php进程的名称
            cli_set_process_title('php father process'); //fpm模式下不可用
            //pcntl_signal(SIGCHLD, SIG_IGN); //安装监听信号
            file_put_contents('./log.txt',"我是主进程,我的process id是" . getmypid()."\n\r", FILE_APPEND);
            $output->writeln('主进程pid'. getmypid()."\n\r");
            sleep(20);
        } else if (0 == $pid) {
            cli_set_process_title('php child process'); //fpm模式下不可用
            // 让子进程休息10秒钟，但是进程结束后，父进程不对子进程做任何处理工作，这样这个子进程就会变成僵尸进程
            try {
                //执行用户函数
                $output->writeln('子进程pid'. getmypid()."\n\r");
                sleep(10);
                file_put_contents('./log.txt',"我是子进程,我的process id是" . getmypid()."\n\r", FILE_APPEND);
                //call_user_func_array($func, $params);
            } finally {
                //执行完后杀死进程
                //posix_kill(posix_getpid(), SIGKILL);
                //exit(0);
            }
        } else {
            exit('fork error.' . PHP_EOL);
        }


    }
}
